// 定义公共方法和全局变量



// 获取token

// const getToken = function() {
// 	// 同步获取token
// 	try {
// 		const value = uni.getStorageSync('token');
// 		if (value) {
// 			console.log("获取成功")
// 
// 			return value
// 		} else {
// 			console.log("获取失败")
// 			uni.reLaunch({
// 				url: "/pages/welcome/welcome"
// 			})
// 		}
// 	} catch (e) {
// 		// error
// 
// 
// 	}
// }
// 
// const getUserId = function() {
// 	// 同步获取userId
// 	try {
// 		const value = uni.getStorageSync('userId');
// 		if (value) {
// 			return value
// 		}
// 	} catch (e) {
// 
// 	}
// }

// 获取邀请码
// const getCode = function() {
// 	try {
// 		const value = uni.getStorageSync('code');
// 		if (value) {
// 			return value
// 		}
// 	} catch (e) {
// 		// error
// 	}
// }
// // 获取用户名
// const getUserName = function() {
// 	try {
// 		const value = uni.getStorageSync('userName');
// 		if (value) {
// 			return value
// 		}
// 	} catch (e) {
// 		// error
// 	}
// }
// 
// // 获取助记词
// const getMnemonic = function() {
// 	try {
// 		const value = uni.getStorageSync('mnemonic');
// 		if (value) {
// 			return value
// 		}
// 	} catch (e) {
// 		// error
// 	}
// }



const convertNum = function(num_str) {
	if (!num_str) {
		return 0
	}
	// 参数必须为 字符串

	var numStr = num_str.toString()
	var minusSign = ''
	if (numStr[0] === '-') {
		numStr = numStr.substring(1)
		minusSign = '-'
	}
	if (numStr.indexOf('E') !== -1 || numStr.indexOf('e') !== -1) {
		var resValue = ''
		var power = ''
		var result = null
		var dotIndex = 0
		var resArr = []
		var sym = ''
		var regExp = new RegExp(
			'^(((\\d+.?\\d+)|(\\d+))[Ee]{1}((-(\\d+))|(\\d+)))$',
			'ig'
		)
		result = regExp.exec(numStr)
		if (result != null) {
			resValue = result[2]
			power = result[5]
			result = null
		}
		if (!resValue && !power) {
			return false
		}
		dotIndex = resValue.indexOf('.')
		resValue = resValue.replace('.', '')
		resArr = resValue.split('')
		if (Number(power) >= 0) {
			var subres = resValue.substr(dotIndex)
			power = Number(power)
			// 幂数大于小数点后面的数字位数时，后面加0
			for (var i = 0; i < power - subres.length; i++) {
				resArr.push('0')
			}
			if (power - subres.length < 0) {
				resArr.splice(dotIndex + power, 0, '.')
			}
		} else {
			power = power.replace('-', '')
			power = Number(power)
			// 幂数大于等于 小数点的index位置, 前面加0
			for (let i = 0; i <= power + dotIndex; i++) {
				resArr.unshift('0')
			}
			var n = power - dotIndex >= 0 ? 1 : -(power - dotIndex)
			resArr.splice(n, 0, '.')
		}
		resValue = resArr.join('')
		return minusSign + sym + resValue
	} else {
		return num_str
	}
}


// 精度计算  begin

//加法函数
const accAdd = function(num1, num2) {
	var baseNum, baseNum1, baseNum2;
	try {
		baseNum1 = num1.toString().split(".")[1].length;
	} catch (e) {
		baseNum1 = 0;
	}
	try {
		baseNum2 = num2.toString().split(".")[1].length;
	} catch (e) {
		baseNum2 = 0;
	}
	baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
	return (num1 * baseNum + num2 * baseNum) / baseNum;
};


//减法函数
const Subtr = function(arg1, arg2) {
	var r1, r2, m, n;
	try {
		r1 = arg1.toString().split(".")[1].length;
	} catch (e) {
		r1 = 0;
	}
	try {
		r2 = arg2.toString().split(".")[1].length;
	} catch (e) {
		r2 = 0;
	}
	m = Math.pow(10, Math.max(r1, r2));
	//last modify by deeka
	//动态控制精度长度
	n = (r1 >= r2) ? r1 : r2;
	return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

//给Number类型增加一个add方法，，使用时直接用 .sub 即可完成计算。
Number.prototype.sub = function(arg) {
	return Subtr(this, arg);
};

/**
 ** 乘法函数，用来得到精确的乘法结果
 ** 说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 ** 调用：accMul(arg1,arg2)
 ** 返回值：arg1乘以 arg2的精确结果
 **/
const accMul = function(arg1, arg2) {
	var m = 0,
		s1 = arg1.toString(),
		s2 = arg2.toString();
	try {
		m += s1.split(".")[1].length;
	} catch (e) {}
	try {
		m += s2.split(".")[1].length;
	} catch (e) {}
	return  Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

/** 
 ** 除法函数，用来得到精确的除法结果
 ** 说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 ** 调用：accDiv(arg1,arg2)
 ** 返回值：arg1除以arg2的精确结果
 **/
// const accDiv = function(arg1, arg2) {
//     var t1 = 0, t2 = 0, r1, r2;
//     try {
//         t1 = arg1.toString().split(".")[1].length;
//     }
//     catch (e) {
//     }
//     try {
//         t2 = arg2.toString().split(".")[1].length;
//     }
//     catch (e) {
//     }
//     with (Math) {
//         r1 = Number(arg1.toString().replace(".", ""));
//         r2 = Number(arg2.toString().replace(".", ""));
//         return (r1 / r2) * pow(10, t2 - t1);
//     }
// }


const accDiv = function(num1, num2) {
	num1 = Number(num1);
	num2 = Number(num2);
	var t1 = 0,
		t2 = 0,
		dec1, dec2;
	try {
		t1 = countDecimals(num1);
	} catch (e) {}
	try {
		t2 = countDecimals(num2);
	} catch (e) {}
	dec1 = convertToInt(num1);
	dec2 = convertToInt(num2);
	var result = accMul((dec1 / dec2), Math.pow(10, t2 - t1));
	return getCorrectResult("div", num1, num2, result);
	// return result;
};

var countDecimals = function(num) {
	var len = 0;
	try {
		num = Number(num);
		var str = num.toString().toUpperCase();
		if (str.split('E').length === 2) { // scientific notation
			var isDecimal = false;
			if (str.split('.').length === 2) {
				str = str.split('.')[1];
				if (parseInt(str.split('E')[0]) !== 0) {
					isDecimal = true;
				}
			}
			let x = str.split('E');
			if (isDecimal) {
				len = x[0].length;
			}
			len -= parseInt(x[1]);
		} else if (str.split('.').length === 2) { // decimal
			if (parseInt(str.split('.')[1]) !== 0) {
				len = str.split('.')[1].length;
			}
		}
	} catch (e) {
		throw e;
	} finally {
		if (isNaN(len) || len < 0) {
			len = 0;
		}
		return len;
	}
};

var convertToInt = function(num) {
	num = Number(num);
	var newNum = num;
	var times = countDecimals(num);
	var temp_num = num.toString().toUpperCase();
	if (temp_num.split('E').length === 2) {
		newNum = Math.round(num * Math.pow(10, times));
	} else {
		newNum = Number(temp_num.replace(".", ""));
	}
	return newNum;
};

var getCorrectResult = function(type, num1, num2, result) {
	var temp_result = 0;
	switch (type) {
		case "add":
			temp_result = num1 + num2;
			break;
		case "sub":
			temp_result = num1 - num2;
			break;
		case "div":
			temp_result = num1 / num2;
			break;
		case "mul":
			temp_result = num1 * num2;
			break;
	}
	if (Math.abs(result - temp_result) > 1) {
		return temp_result;
	}
	return result;
};

// 精度计算  end


var formatDateTime = function(inputTime) { //时间戳 转 YY-mm-dd HH:ii:ss 
	var date = new Date(inputTime);
	var y = date.getFullYear();
	var m = date.getMonth() + 1;
	m = m < 10 ? ('0' + m) : m;
	var d = date.getDate();
	d = d < 10 ? ('0' + d) : d;
	var h = date.getHours();
	h = h < 10 ? ('0' + h) : h;
	var minute = date.getMinutes();
	var second = date.getSeconds();
	minute = minute < 10 ? ('0' + minute) : minute;
	second = second < 10 ? ('0' + second) : second;
	return y + '/' + m + '/' + d + ' ' + h + ':' + minute + ':' + second;
};

var formatDateTime2 = function(inputTime) { //时间戳 转 YY-mm-dd HH:ii:ss 
	var date = new Date(inputTime);
	var m = date.getMonth() + 1;
	m = m < 10 ? ('0' + m) : m;
	var d = date.getDate();
	d = d < 10 ? ('0' + d) : d;
	var h = date.getHours();
	h = h < 10 ? ('0' + h) : h;
	var minute = date.getMinutes();
	var second = date.getSeconds();
	minute = minute < 10 ? ('0' + minute) : minute;
	second = second < 10 ? ('0' + second) : second;
	return m + '/' + d + ' ' + h + ':' + minute + ':' + second;
};

// 图片转Base64


var urlTobase64 = function(url) {
	uni.request({
		url: url,
		method: 'GET',
		responseType: 'arraybuffer',
		success: ress => {
			let base64 = wx.arrayBufferToBase64(ress.data); //把arraybuffer转成base64 
			base64 = 'data:image/jpeg;base64,' + base64 //不加上这串字符，在页面无法显示的哦
			console.log(base64)
		}
	})
};

// 取小数位后几位
var getToFixed = function(number, digits) {
	if (!digits) {
		digits = 2
	}
	number = parseFloat(number)
	digits = parseInt(digits)
	return number.toFixed(digits)
};

/// 小数位不够，用0补足位数
var changeDecimalBuZero = function(number, bitNum) {
	var f_x = parseFloat(number);
	if (isNaN(f_x)) {
		return 0;
	}
	var s_x = number.toString();
	var pos_decimal = s_x.indexOf('.');
	if (pos_decimal < 0) {
		pos_decimal = s_x.length;
		s_x += '.';
	}
	while (s_x.length <= pos_decimal + bitNum) {
		s_x += '0';
	}
	return s_x;
}





// 合约交易页面合约参数
var contractIndexCoin = '';

// 根据精度自动补0
const prefixInteger = function(num, length) {
	return (Array(length).join('0') + num).slice(-length);
}

// 保留小数位数
const getDecimal = function(str, n) {
	if (n && parseInt(n) > 0) {
		var newString = str.toString()
		var newN = parseInt(n)
		// console.log(newString.indexOf('.'))
		if (newString.indexOf('.') > -1) {
			return newString.substring(0, (newString.indexOf('.') + newN + 1))
		} else {
			var zero = ''
			for (var i = 0; i < newN; i++) {
				zero += '0'
			}
			return newString + '.' + zero
		}
	} else {
		// 若没有传参数n，则默认向下取整
		return Math.floor(str)
	}
}





export default {
	// 	getIfBack,
	// 	getToken,
	// 	getUserId,
	// 	getCode,
	// 	getUserName,
	// 	getMnemonic,
	accMul,
	accDiv,
	accAdd,
	Subtr,
	formatDateTime,
	formatDateTime2,
	contractIndexCoin,
	urlTobase64,
	getToFixed,
	prefixInteger,
	changeDecimalBuZero,
	convertNum,
	getDecimal
}
